﻿using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Father
{
    string name;
    public Father(string name)
    {
        this.name = name;
    }
}
public class Son : Father
{
    public Son(string name):base(name)
    {
    }
}
public class Reflection : MonoBehaviour
{
    void Start()
    {
        #region 反射知识回顾
        //反射3剑客 1T 两A
        //Type      用于获取 类的所有信息 字段 属性 方法 等等
        //Assembly  用于获取程序集 通过程序集获取Type
        //Activator 用于快速实例化对象
        #endregion

        #region 判断一个类型的对象是否可以让另一个类型为自己分配空间
        //父类装子类
        //是否可以从某一个类型的对象 为自己分配空间
        Type fatherType = typeof(Father);
        Type sonType = typeof(Son);
        //调用者 通过方法进行判断 判断是否可以通过传入的类型为自己 分配空间
        if (fatherType.IsAssignableFrom(sonType))
        {
            Debug.Log("Son可以为Father分配空间");
            Father f = Activator.CreateInstance(sonType, "小明") as Father;
            print(f);
        }
        else
        {
            Debug.Log("Son不可以为Father分配空间");
        }
        #endregion

        #region 通过反射获取泛型类型
        List<string> list = new List<string>();
        Type listType = list.GetType();

        //获取泛型类型
        Type[] types =  listType.GetGenericArguments();
        Debug.LogFormat("List types:{0}", types[0]);  //输出 System.String

        Dictionary<string, float> dic = new Dictionary<string, float>();
        Type dicType = dic.GetType();
        types = dicType.GetGenericArguments();
        Debug.LogFormat("Dictionary types:{0}-{1}", types[0], types[1]);  //输出 System.String-System.Single
        #endregion
    }
}
